//package com.geek.gkfgw.web.aspect;
//
//import com.geek.gkfgw.framework.cache.util.EhcacheUtils;
//import com.geek.gkfgw.framework.cache.util.RedisUtils;
//import com.geek.gkfgw.service.token.bean.TokenInfo;
//import com.geek.gkfgw.util.excp.GkFgwCodeEnum;
//import com.geek.gkfgw.util.excp.GkFgwException;
//import com.geek.gkfgw.util.json.JacksonUtils;
//import org.springframework.web.servlet.HandlerInterceptor;
//
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//
///**
// * <h1>请输入一句美丽的描述话语</h1>
// *
// * @author hmilyylimh
// * ^_^
// * @version 0.0.1
// * ^_^
// * @date 2023/11/15 21:05
// */
//public class TokenInterceptor2 implements HandlerInterceptor {
//
//    /** <h2>前端上送的请求头 key，含义就是短令牌的 key</h2> **/
//    private static final String ACCESS_TOKEN = "accesstoken";
//
//    @Override
//    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        // 1. 获取 accessToken
//        String accessToken = extractAccessToken(ACCESS_TOKEN);
//
//        // 2. 检查 Ehcache 的缓存结果，有就通过，没有就继续往下走
//        TokenInfo tokenInfo2 = checkEhcacheThrowIfExpired(accessToken);
//        if(tokenInfo2.isAlived()){
//            return true;
//        }
//
//        // 3. 检查 Redis 的缓存结果，没有制造一份失效数据，有就继续往下走，总之的到了一份数据
//        tokenInfo2 = RedisUtils.get("key_prefix_" + accessToken, TokenInfo2.class);
//        if(tokenInfo2 != null){
//            // 4. 这里需要给 Ehcache 赋值令牌信息，通过 Redis 消息订阅频道，发送消息，成功与否都不关注，只要能发就行了
//            publishRedisMessage(accessToken, tokenInfo2);
//            // 5. 最后返回 true 标识验证一切正常，没有任何问题
//            return true;
//        }
//
//        tokenInfo2 = generateInvalidTokenInfo();
//        publishRedisMessage(accessToken, tokenInfo2);
//        // 对 response 写流，另外一种直接抛异常，最终在统一的地方处理异常
//        throw new GkFgwException(GkFgwCodeEnum.INVALID_TOKEN);
//    }
//
//    public boolean preHandle2(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        // 1. 获取 accessToken
//        String accessToken = extractAccessToken(ACCESS_TOKEN);
//        // 2. 检查 Ehcache 的缓存结果，有就通过，没有就继续往下走
//        TokenInfo tokenInfo2 = EhcacheUtils.get("key_prefix_" + accessToken, TokenInfo.class);
//        if(tokenInfo2 == null){
//            // donothing
//        } else if (tokenInfo2.isExpired()) {
//            throw new GkFgwException(GkFgwCodeEnum.INVALID_TOKEN);
//        } else {
//            return true;
//        }
//        // 3. 检查 Redis 的缓存结果，没有制造一份失效数据，有就继续往下走，总之的到了一份数据
//        tokenInfo2 = RedisUtils.get("key_prefix_" + accessToken, TokenInfo2.class);
//        if (tokenInfo2 == null) {
//            tokenInfo2 = generateInvalidTokenInfo();
//            publishRedisMessage(accessToken, tokenInfo2);
//            // 对 response 写流，另外一种直接抛异常，最终在统一的地方处理异常
//            throw new GkFgwException(GkFgwCodeEnum.INVALID_TOKEN);
//        }
//        // 4. 这里需要给 Ehcache 赋值令牌信息，通过 Redis 消息订阅频道，发送消息，成功与否都不关注，只要能发就行了
//        publishRedisMessage(accessToken, tokenInfo2);
//        // 5. 最后返回 true 标识验证一切正常，没有任何问题
//        return true;
//    }
//}
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
